
package TokensDelLenguaje;

import PolacaInversa.Registro;
import java.util.ArrayList;

public class Token_Asignacion extends Token_Operador {
    
    public Token_Asignacion (){
        super(Tokens.asignacion);
    }

    @Override
    public String toString(){
        return ("[ := ]");
    }
    
    public ArrayList conversionImplicita(Token o1, Token o2, Registro reg) {
        ArrayList list = new ArrayList();
        String s = "";
        Tokens op1 = o1.getId();
        Tokens op2 = o2.getId();
        
        //La logica de la tabla de conversion para este operador
        if (op1 == Tokens.const_uinteger && op2 == Tokens.const_uinteger) {
            list.add(s);
        }
            else if (op1 == Tokens.const_ulongint && op2 == Tokens.const_ulongint) {
                list.add(s);
            }
                else if (op1 == Tokens.const_ulongint && op2 == Tokens.const_uinteger) {
                    //Generar Assembler.
                    list.add(false);
                    s = "Error de Gen. de Código: linea " + o1.getLinea() + " - No se puede realizar la conversión.";
                    list.add(s);
                    return list;
                }
                    else if (op1 == Tokens.const_uinteger && op2 == Tokens.const_ulongint) {
                        //Generar Assembler.
                        s = conversion(o1,reg);
                        list.add(s);
                    }
        s += "MOV " + reg.nombre + o1.getNombre() + "\n";
        list.add(0, true);
        return list;
    }
    
    public ArrayList traducir_assembler(Token o1, Token o2, Registro reg){
        ArrayList list = super.traducir_assembler(o1, o2, reg);
        ArrayList l = new ArrayList();
        String s = (String) list.get(1);
        if((Boolean)list.get(0)){
            /*if((!(o1.getId() == Tokens.const_uinteger && o2.getId() == Tokens.const_ulongint)) &&
                    (!reg.nombre.equals(o1.getNombre()))){
                s += "MOV " + reg.nombre + ", " + o1.getNombre()  + "\n";
            }
            s += "MOV " + o2.getNombre() + ", " + reg.nombre + "\n";*/
            if(!o2.getNombre().equals(reg.nombre)){
                if(!(o1.getId() == Tokens.const_uinteger && o2.getId() == Tokens.const_ulongint)){
                    s += "MOV " + reg.nombre + ", " + o1.getNombre() + "\n";
                }
                s += "MOV " + o2.getNombre() + ", " + reg.nombre + "\n";
            }
            else{
                s += "MOV " + reg.nombre + ", " + o1.getNombre() + "\n";
                s += "MOV " + o2.getNombre() + ", " + reg.nombre + "\n";
            }
        }
        l.add(list.get(0));
        l.add(s);
        return l;
    }
}
